home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / xobbs.arc / maildaemon.c < prev    next >
C/C++ Source or Header  |  1989-05-07  |  8KB  |  248 lines

  1. /* MAILDAEMON.C Mail daemon process for XOBBS. Jim Durham, W2XO 4-4-89 */
  2. /* Version 1.3 */
  3. /* Code released to the amateur radio community */
  4.  
  5. #define MAIN 1
  6. #define MAILDAEMON
  7. #include "xobbs.h"
  8. #include <string.h>
  9. #ifndef hpux
  10. #include <sys/signal.h>
  11. #endif
  12.  
  13. char buf[4096];
  14. void exit();
  15. int domail();
  16.  
  17. main()
  18. {
  19.         umask(0);
  20.     getconfig();
  21.  
  22.     signal(SIGUSR1,domail);
  23.     for(;;){
  24.         pause();
  25.         signal(SIGUSR1,domail);
  26.     }
  27. }
  28.  
  29. domail()
  30. {
  31.     char filnam[40],c,*bp,*cp;
  32.     FILE *fp;
  33.     char temp[20];
  34.     int fd1,i;
  35.         
  36.     signal(SIGUSR1,SIG_IGN);
  37.  
  38.  
  39.     gethighnum(1);        /*update the highest message number*/
  40.     sprintf(prinbuf,"ls %s",tempdir);
  41.     fp=popen(prinbuf,"r");        /*get the temp directory*/
  42.     i=0;
  43.  
  44.     while(((c=fgetc(fp)) != EOF) && (i < 4095))    /*read in the names*/
  45.      buf[i++]=c;
  46.     buf[i]='\0';        /*terminate the names*/
  47.  
  48.     pclose(fp);            /*close the pipe*/
  49.  
  50.     bp=buf;            /*point to the first name in the buffer*/
  51.  
  52.         /*loop and service each file in the temp directory*/
  53.     for(;;){
  54.     if(*bp=='\n') bp++;    /*if sitting on a lf, increment*/
  55.     if(*bp=='\0') break;    /*if end of buffer, leave*/
  56.         cp=filnam;        /*point to the filname space*/
  57.     while(*bp != '\n')
  58.         *cp++ = *bp++;     /*read up to next lf into filnam*/
  59.     *cp='\0';            /*terminate the filname*/
  60.  
  61.         checkfwd(filnam);
  62.  
  63.     }/* for(;;) */            /*loop back for more names*/
  64.  
  65.  
  66.         /*now, open the parameter file and update it*/
  67.  
  68.     if((fd1=open(paramfil,O_WRONLY|O_CREAT,0x1b6)) < 0){    /*open param file*/
  69.     sprintf(prinbuf,"maildaemon:Cant open %s\n",paramfil);
  70.     perror(prinbuf);
  71.     exit(1);
  72.     }
  73.     
  74.     sprintf(temp,"%6d",highnum);
  75.     write(fd1,temp,(strlen(temp)+1));
  76.     close(fd1);
  77.  
  78. }                            /*and go home*/
  79.  
  80. checkfwd(filnam)
  81.     char *filnam;                /* file name of file to be checked*/
  82. {
  83.     int fd; 
  84.     int fd1;
  85.     int fd2;
  86.     char hdr[128];
  87.     char fhdr[128];
  88.     char temp[128];
  89.     char *p;
  90.     char bbscall[8];
  91.      
  92.     struct msghdr mhdr;
  93.     int done;
  94.     
  95.     done = 0;
  96.  
  97.     sprintf(temp,"%s%s",tempdir,filnam);
  98.     if((fd = open(temp,O_RDONLY)) < 1){  /*open the message file*/
  99.         sprintf(prinbuf,"checkfwd:Cant open message file\n");
  100.         perror(prinbuf);
  101.     close(fd);
  102.         return;
  103.     }
  104.  
  105.     fgetline(fd,hdr);                /*read the header info into buffer*/
  106.     conhdr(hdr,&mhdr);             /*get header into header structure form*/
  107.     sprintf(fhdr,"%-5d %-85.85s\n",highnum,hdr); /*get ready for possible*/
  108.                         /*write of header*/
  109.  
  110.  
  111.         /*first, get stuff for THIS bbs */
  112.  
  113.     if( ( (!(strcmp(mhdr.tocall,my.call))) || (!(strcmp(mhdr.atbbs,my.call))))
  114.            || ((mhdr.atbbs[0] == '\0') || (mhdr.stat == 'F'))){
  115.                                      /* if this is to my call */
  116.                                      /*or no atbbs call at all*/
  117.                                      /* then, we do only a move*/
  118.                          /* to OUR mail directory*/
  119.         close(fd);                 /*close the file, we will use system call*/
  120.  
  121.            /* write it to the mail directory*/
  122.         sprintf(temp,"mv %s%s %s%d",tempdir,filnam,maildir,highnum);
  123.         system(temp);
  124.     writnewhdr(fhdr);        /*write out the new header */
  125.     highnum++;                /*increment the high num*/
  126.         return;
  127.     }
  128.     close(fd);
  129.     
  130.     if((fd1 = open(usenetfil,O_RDONLY)) < 1){    /*open distribution file*/
  131.         sprintf(prinbuf,"checkfwd: Can't open distribution file\n");
  132.         perror(prinbuf);
  133.         close(fd1);
  134.         return;
  135.     }
  136.  
  137.     done = 0;
  138.     while(fgetline(fd1,inline)){  /*read a line from usenet file*/
  139.     if(!strcmp(mhdr.tocall,upcase(inline))){  /*if this guy is on usenet*/
  140.             sprintf(temp,"mail  -s mhdr.title %s < %s%s",lowcase(inline),tempdir,filnam);
  141.         system(temp);
  142.         sprintf(temp,"%s%s",tempdir,filnam);
  143.         unlink(temp);
  144.         return;
  145.     }
  146.     }
  147.     close(fd1);
  148.  
  149.     if((fd1 = open(fwddist,O_RDONLY)) < 1){    /*open distribution file*/
  150.         sprintf(prinbuf,"checkfwd: Can't open distribution file\n");
  151.         perror(prinbuf);
  152.         close(fd1);
  153.         return;
  154.     }
  155.  
  156.     done = 0;
  157.     while(fgetline(fd1,inline)){  /*read a line from distribution file*/
  158.         if(inline[0] == '$'){
  159.             rdfield(&inline[1],temp);           /*get the dist. net name*/
  160.             if(!strncmp(temp,mhdr.atbbs,strlen(mhdr.atbbs))){
  161.                             /*if @bbs matches dist. name*/
  162.                                         /* then read up to next *** */
  163.                     /*first, make a copy for THIS bbs */
  164.                 sprintf(temp,"mv %s%s %s%d",tempdir,filnam,maildir,highnum);
  165.                 system(temp);
  166.         writnewhdr(fhdr);
  167.  
  168.                                     /*make distribution copies*/
  169.                 while((fgetline(fd1,inline)) && (inline[0] != '*')){
  170.                     sprintf(temp,"ln %s%d %s%s%s"
  171.                           ,maildir,highnum,fwddir,inline,filnam);
  172.                     system(temp);
  173.                 }
  174.                 highnum++;                /*increment the high num*/
  175.         done = 1;
  176.         break;
  177.             }
  178.         }
  179.     }  /*while*/
  180.  
  181.     close(fd1);                 /*close the distribution file*/
  182.     if(done)            /* if we are done, return*/
  183.         return(1);
  184.                                 /* let's check the forwarding file */
  185.     if((fd=open(fwdfile,O_RDONLY)) < 1){ /*open the forwarding file*/
  186.         sprintf(prinbuf,"checkfwd: Can't open forwarding file\n");
  187.         perror(prinbuf);
  188.         return(0) ;
  189.     }
  190.     while(fgetline(fd,inline)){   /*get a line from the forwarding file*/
  191.         switch(inline[0]){
  192.             case 'G':
  193.                 p=inline;                   /*point to the line*/
  194.                 while(*p++ != ' ');         /*toggle up to the space*/
  195.                 rdfield(p,bbscall);         /*get the bbs call from the line */
  196.                 break;
  197.             case 'C':       /*connect line*/
  198.                 break;
  199.             case 'S':       /* 'send' line*/
  200.                 break;
  201.             case 'R':       /* response line*/
  202.                 break;
  203.             default:
  204.                 if((matchn2(mhdr.atbbs,inline,strlen(mhdr.atbbs)))
  205.                     || (matchn2(mhdr.tocall,inline,strlen(mhdr.atbbs)))){
  206.                     if(mhdr.type == 'B'){    /* if this is a bulletin*/
  207.                         sprintf(temp,"cp %s%s %s%s%s"
  208.                             ,tempdir,filnam,fwddir,bbscall,filnam);
  209.                         system(temp);
  210.                         sprintf(temp,"mv %s%s %s%d",tempdir,filnam,maildir,highnum);
  211.                         system(temp);
  212.             writnewhdr(fhdr);
  213.                         highnum++;                /*increment the high num*/
  214.                     }
  215.                     else{
  216.                         sprintf(temp,"mv %s%s %s%s%s"
  217.                             ,tempdir,filnam,fwddir,bbscall,filnam);
  218.                         system(temp);
  219.                 }
  220.             }  /*if !strcmp() */
  221.             break;
  222.         }  /* switch*/
  223.     }
  224.     close(fd);
  225.     return(1);
  226. }
  227.  
  228. writnewhdr(hdr)
  229.     char *hdr;
  230. {
  231.     int fd,fd1,n;
  232.         char hdrtmp[30];
  233.     char oldhdr[30];
  234.  
  235.     sprintf(hdrtmp,"%shdrtmp",homedir);
  236.     sprintf(oldhdr,"%soldhdr",homedir);
  237.     if((fd = open(hdrtmp,O_CREAT|O_RDWR,0666)) < 1){  /*open temp hdr file*/
  238.         perror("Maildaemon:writnewhdr():Cant make hdr temp file\n");
  239.         return;
  240.     }
  241.     write(fd,hdr,92);            /*write new header*/
  242.     close(fd);
  243.     sprintf(prinbuf,"mv %s %s",hdrfile,oldhdr);    /*save old header file*/
  244.     system(prinbuf);
  245.     sprintf(prinbuf,"cat %s %s > %s",hdrtmp,oldhdr,hdrfile);
  246.     system(prinbuf);
  247. }
  248.